/*******************************************************************************
 *
 * File:        GLOBVAR.c
 * Progetto:    Robottino
 * Ambiente:    PIC32
 * Data:        14/03/2012
 * Autore:      M. Tili
 * Versione:    00.02
 *
 * Descrizione: 
 *   File contenente le variabili globali del progetto e le funzioni di 
 *   inizializzazione di tali variabili.
 *
 *
 * Modifica:  15/05/2012  | M.Tili
 *                        | Inserito buffer degli errori PRI e SEC;
 *                        | inserito coda circolare degli eventi.
 * Modifica:  16/05/2012  | M.Tili
 *                        | Inserita variabile version e inserite descrizioni
 *                        | delle varie funzioni di questo modulo.
 *
 */
#include "CONFIG.h"
#include "TYPEDEFS.h"
#include "QUTIL.h"
#include "GLOBVAR.h"

/* Versione generale del software */
const char version[] = {"00.0000"};

/* Descrittore degli input/ouput di sistema */
t_data_stat ioDataStat;

/* CODA CIRCOLARE per eventi generici */
e_event_id eventQ[CFG_GLOBVAR_EVENT_QUEUE_SIZE]; /* Allocazione statica di 
                                                  * memoria per la coda di 
                                                  * eventi generici 
                                                  */
t_queue *  ptrEventQ;                            /* Puntatore alla coda 
                                                  * circolare di eventi generici
                                                  */


/* CODA CIRCOLARE per ERRORI */
static t_error    errBuff[CFG_GLOBVAR_MAX_ERRORS];
static t_queue  * ptrErrBuf;




/* Contiene il codice di errore fatale (MAX 15 errori + NONE) */
static INT8U      fatalError;


/*******************************************************************************
 *
 *  GlobvarInit
 *  Descrizione: Questa funzione inizializza i dati del modulo GLOBVAR, che 
 *               contiene i dati globali del programma.
 *
 */
void GlobvarInit(void)
{
  BOOLEAN ret;
  ret = FALSE;
  
  fatalError = ERR_FATAL_NONE;

  ret = QInit(ptrEventQ, &eventQ, CFG_GLOBVAR_EVENT_QUEUE_SIZE);
  if (ret == FALSE)
  {
    FatalErrorSet((INT8U) ERR_FATAL_Q_INIT_1);
  }

  ret = QInit(ptrErrBuf, &errBuff, CFG_GLOBVAR_EVENT_QUEUE_SIZE);
  if (ret == FALSE)
  {
    FatalErrorSet((INT8U) ERR_FATAL_Q_INIT_2);
  }

  
  ioDataStat.input.keyState[KEY_ID_00]  = STATE_LOW;
  ioDataStat.input.keyState[KEY_ID_01]  = STATE_LOW;
  ioDataStat.input.keyState[KEY_ID_02]  = STATE_LOW;
  ioDataStat.output.ledState[LED_ID_00] = STATE_LOW;
  ioDataStat.output.ledState[LED_ID_01] = STATE_LOW;
  ioDataStat.output.ledState[LED_ID_02] = STATE_LOW;

}


/*******************************************************************************
 *
 *  ErrorSet
 *  Descrizione: Questa funzione accoda nella coda apposita il codice 
 *               il codice dell'errore passato come parametro. 
 *               Se la coda e' piena allora segnala il relativo errore fatale.
 *    |  errId          | codice dell'errore                                   |
 *
 */
void ErrorSet(INT16U errId)
{
  if (QPut(ptrErrBuf, &errId, sizeof(INT16U)) == FALSE)
  {
    FatalErrorSet(INT8U ERR_FATAL_Q_ERR_FULL);
  }
}

/*******************************************************************************
 *
 *  ErrorGet
 *  Descrizione: Questa funzione restituisce il primo errore presente nella 
 *               relativa coda.
 *               Se c'e' un'inconsistenza sulla dimensione della coda, segnala
 *               il relativo errore fatale.
 *
 */
INT16U ErrorGet()
{
  INT16U retErrId;
  retErrId = ERR_STD_NO_ERRORS;
  if (QIsEmpty(ptrErrBuf) == FALSE)
  {
    if (QGet(ptrErrBuf, &retErrId, sizeof(INT16U)) == FALSE)
    {
      FatalErrorSet(INT8U ERR_FATAL_Q_ERR_EMPTY);
      retErrId = ERR_STD_Q_ERRGETEMPTY;
    }
  }
  return retErrId;
}

/*******************************************************************************
 *
 *  FatalErrorSet
 *  Descrizione: Questa funzione accoda nella coda apposita il codice 
 *               il codice dell'errore FATALE passato come parametro, se non ne 
 *               era gia' presente uno.
 *    |  errFatId       | codice dell'errore                                   |
 *
 */
void FatalErrorSet(INT8U errFatId)
{
  if (fatalError != ERR_FATAL_NONE)
  {
    fatalError = errFatId;
  }
}

/*******************************************************************************
 *
 *  FatalErrorGet
 *  Descrizione: Questa funzione restituisce il codice di errore FATALE.
 *
 */
INT8U FatalErrorGet(void)
{
  return fatalError;
}


